package com.tencent.ymcc.exception;

import com.tencent.ymcc.constance.GlobalConstances;
import com.tencent.ymcc.result.JSONResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 异常捕捉类
 * @author Rixyo
 * @since Create in 2022/7/7 9:51
 */
// 如果打了这个注解 所有的从controller经过的请求 只要出现异常都会走到这里面来
@RestControllerAdvice // ControllerAdvice + ResponseBody
public class GlobalExceptionHandler {

    /**
     * 全局异常捕捉
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class) // 需要处理的异常类型.class
    public JSONResult globalExceptionHandler(Exception e) {
        return JSONResult.error(GlobalConstances.SYSTEM_EXCEPTION.getMessgae(), GlobalConstances.SYSTEM_EXCEPTION.getCode());
    }

    /**
     * 自定义异常捕捉
     * @param e
     * @return
     */
    @ExceptionHandler(GlobalCustomException.class) // 需要处理的异常类型.class
    public JSONResult globalCustomExceptionHandler(GlobalCustomException e) {
        return JSONResult.error(e.getMessage(), e.getCode());
    }

    /**
     * 校验异常捕捉
     * @param e
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class) // 需要处理的异常类型.class
    public JSONResult methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
        StringBuilder sb = new StringBuilder();

        e.getBindingResult().getAllErrors().forEach(error -> {
            sb.append(error.getDefaultMessage()).append(";");
        });

        return JSONResult.error(sb.toString(), GlobalConstances.VAILDATE_EXCEPTION.getCode());
    }

}
